package com.swak.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

import com.swak.utils.StringUtils;

/**
 * 可靠消息，两种方式创建可靠消息：<br>
 * 1. 根据方法的返回值，会将方法的返回值作为消息，所有需要将路由等信息填入<br>
 * 2. 使用消息创建工厂，这种方式比较灵活，会调用指定类的同名方法且将返回值作为参数传递<br>
 * 优先使用第二种方式， 例如： <br>
 * 
 * UserServiceImpl.class<br>
 * 
 * <p>
 * ReliableMsg(confirm = "registerMsg") <br>
 * public User register(UserAccount account) {<br>
 * return new User;<br>
 * } <br>
 * 
 * <p>
 * public UserMsg registerMsg(UserAccount account) {<br>
 * return new UserMsg;<br>
 * } <br>
 * 
 * 
 * @author lifeng
 * @date 2020年12月31日 下午5:13:15
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Consistency
public @interface ReliableMsg {

	/**
	 * @return 配置一致性的方案
	 */
	@AliasFor(annotation = Consistency.class)
	ConsistencyScheme scheme() default ConsistencyScheme.Reliable_Msg;

	/**
	 * 队列
	 * 
	 * @return
	 */
	String queue() default StringUtils.EMPTY;

	/**
	 * 事件类型：不能为 -128；
	 * 
	 * @return
	 */
	byte event() default -128;

	/**
	 * 重试次数: 
	 * <0 : 使用默认的重试次数
	 * 0 : 不进行重试
	 *  >0 : 自定义重试次数
	 * 
	 * @return
	 */
	int retryTimes() default -1;

	/**
	 * 使用的底层技术
	 * 
	 * 清空缓存等事件，建议使用： Redis；
	 * 
	 * @return
	 */
	QueueTypes queueType() default QueueTypes.Rabbit;

	/**
	 * 可靠消息的创建方法
	 * 
	 * @return
	 */
	String confirm() default StringUtils.EMPTY;
}